
//堆向下调整（以小堆为例）对于集合{27，15，19，18，28，34，65，49，25，37}
//思路：1.让parent标记所需要调整的位置的结点，child标记parent的左孩子(要先判断是否为空)
//2.如果parent的左孩子存在，即child<size,进行以下操作，直到parent的左孩子不存在
//[1]parent右孩子是否存在，存在找出左右孩子中最小的孩子，让child进行标记
//[2]将parent与较小的孩子child进行比较，调整结束，否则：交换parent与较小的孩子child，交换完之后
//parent中大的元素向下移动，可能导致子树不满足对的性质，因此需要继续向下调整，即parent = child, child = parent*2+1;


import java.util.Arrays;

public class Eg {
    public void shiftDown(int[] array, int parent) {
        //child先标记parent的左孩子，因为parent可能没有右孩子
        int child = 2 * parent + 1;
        int size = array.length;

        while (child < size) {
            //如果右孩子存在，找到左右孩子中较小的孩子，用child进行标记
            if (child + 1 < size && array[child + 1] < array[child]) {
                child += 1;
            }

            //如果双亲比其最小的孩子还小，说明该结构已经满足堆的特性了
            if (array[parent] <= array[child]) {
                break;
            } else {
                //双亲与较小的孩子交换
                int t = array[parent];
                array[parent] = array[child];
                array[child] = t;

                //parent中大的元素往下移动，可能会造成子树不满足堆的性质，因此需要继续向下调整
                parent = child;
                child = parent * 2 + 1;
            }
        }
    }

}
